function textprogressbar(status, c)
% This function creates a text progress bar. It should be called with a 
% STRING argument to initialize and terminate. Otherwise the number corresponding 
% to progress in % should be supplied.
% INPUTS:   C   Either: Text string to initialize or terminate 
%                       Percentage number to show progress 
%           status: takes value 'new', 'update', 'done'
% OUTPUTS:  N/A
% Example:  Please refer to demo_textprogressbar.m

% Author: Paul Proteus (e-mail: proteus.paul (at) yahoo (dot) com)
% Version: 1.0
% Changes tracker:  29.06.2010  - First version

% Inspired by: http://blogs.mathworks.com/loren/2007/08/01/monitoring-progress-of-a-calculation/

%% Initialization
global strCR;           %   Carriage return pesistent variable

% Vizualization parameters
strPercentageLength = 10;   %   Length of percentage string (must be >5)
strDotsMaximum      = 20;   %   The total number of dots in a progress bar

%% Main 

%if isempty(strCR) && ~ischar(c)
    % Progress bar must be initialized with a string
%    error('The text progress must be initialized with a string');
switch status
    case 'new'
%elseif isempty(strCR) && ischar(c)
    % Progress bar - initialization
        fprintf('%s',c);
        strCR = -1;
%elseif ~isempty(strCR) && ischar(c)
        case 'done'
    % Progress bar  - termination
        strCR = [];  
    fprintf([c '\n']);
    case 'update'
%elseif isnumeric(c)
    % Progress bar - normal progress
        c = floor(c);
        percentageOut = [num2str(c) '%%'];
        percentageOut = [percentageOut repmat(' ',1,strPercentageLength-length(percentageOut)-1)];
        nDots = floor(c/100*strDotsMaximum);
        dotOut = ['[' repmat('.',1,nDots) repmat(' ',1,strDotsMaximum-nDots) ']'];
        strOut = [percentageOut dotOut];

    % Print it on the screen
        if strCR == -1
            % Don't do carriage return during first run
            fprintf(strOut);
        else
            % Do it during all the other runs
            fprintf([strCR, strOut]);
        end
    
    % Update carriage return
        strCR = repmat('\b', 1, length(strOut) - 1);
    otherwise
        error('status must be ''new'', ''update'', or ''done''')
%else
    % Any other unexpected input
%    error('Unsupported argument type');
end
